
package com.letoo.dragon.common.utils;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * FreeMarker的工具类
 * 
 * @author dengjie
 *
 */
public class FreeMarkerUtils {

	private FreeMarkerUtils() {
	}

	private static final Logger LOG = LoggerFactory.getLogger(FreeMarkerUtils.class);

	private static final Integer TEMPLATE_LOADING_FILE = 1;
	private static final Integer TEMPLATE_LOADING_PROJECT = 2;
	/** 编码格式 UTF-8 */
	private static final String ENCODING = "UTF-8";
	private static Configuration freemarkerConfig;

	static {
		LOG.info("initConfig begin");
		try {
			initConfig(TEMPLATE_LOADING_PROJECT, "/templates");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 初始化Freemarker参数配置
	 * 
	 * @param type
	 *            模板文件夹路径类型，1：文件系统路径；2：项目路径
	 * @param dir
	 *            模板文件夹路径，当type=1时，文件系统中的绝对路径；当type=2时，项目中相对路径，与src同级开始,以"/开头"
	 * @throws Exception
	 */
	public static void initConfig(Integer type, String dir) throws Exception {
		/**
		 * 通过Freemaker的Configuration读取相应的ftl,配置Freemarker模板参数信息
		 */
		freemarkerConfig = new Configuration();
		// 设置文件编码为UTF-8
		freemarkerConfig.setEncoding(Locale.getDefault(), ENCODING);
		/**
		 * 设置模板本件夹路径： 1、setDirectoryForTemplateLoading，文件系统绝对路径
		 * 2、setClassForTemplateLoading项目相对路径
		 */
		if (TEMPLATE_LOADING_FILE == type) {
			try {
				freemarkerConfig.setDirectoryForTemplateLoading(new File(dir));
			} catch (IOException e) {
				throw new Exception("设置模板文件夹异常", e);
			}

		}
		if (TEMPLATE_LOADING_PROJECT == type) {
			freemarkerConfig.setClassForTemplateLoading(FreeMarkerUtils.class, dir);
		}
	}

	/**
	 * 获取Freemarker模板文件
	 * 
	 * @param name
	 *            文件名
	 * @return
	 */
	public static Template getTemplate(String name) {
		Template temp = null;
		try {
			temp = freemarkerConfig.getTemplate(name, "UTF-8");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return temp;

	}

	/**
	 * 将解析之后的文件内容保存到文件中
	 * 
	 * @param name
	 *            模板文件名
	 * @param root
	 *            数据Map
	 * @param outFile
	 *            保存文件路径
	 */
	public static void printFile(String name, Map<String, Object> root, String outFile) {
		FileWriter out = null;
		try {
			// 通过一个文件输出流，就可以写到相应的文件中
			out = new FileWriter(new File(outFile));
			Template temp = getTemplate(name);
			temp.process(root, out);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 将解析之后的文件内容返回字符串
	 * 
	 * @param name
	 *            模板文件名
	 * @param root
	 *            数据Map
	 * @return
	 */
	public static String printString(String name, Map<String, Object> root) {
		StringWriter out = new StringWriter();
		try {
			// 通过一个文件输出流，就可以写到相应的文件中
			Template temp = getTemplate(name);
			temp.process(root, out);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return out.toString();
	}

	public static void main(String[] args) {
		try {
			FreeMarkerUtils.initConfig(TEMPLATE_LOADING_FILE, "/templates");
		} catch (Exception e) {
			e.printStackTrace();
		}
		Map<String, Object> root = new HashMap<String, Object>();
		root.put("template", "asdfasfsfd");
		System.out.println(FreeMarkerUtils.printString("template-contract.ftl", root));
	}
}
